package cn.jetpiece.cloud.system.dp.app.utils;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.jetpiece.cloud.model.exception.ServiceException;
import cn.jetpiece.cloud.system.dp.app.modular.biz.entity.LngLat;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

/**
 * @ClassName: com.hckj.iot.dust.core.util.TianApiUtil
 * @Description: tianditu
 * @Date: 2020/12/15
 * @Version: 1.0
 */
@Slf4j
public class TianApiUtil {

    public static final String TIAN_TK = "8c6eb43cbd421263f1ca80b381e052a3";

    public static LngLat getLocation(String areaInfo){
        String locationUrl = "http://api.tianditu.gov.cn/geocoder?ds={}&tk={}";
        String queryJson = "{\"keyWord\":\"{}\"}";
        String keyWord = null;
        try {
            keyWord = URLEncoder.encode(StrUtil.format(queryJson, areaInfo), "UTF-8");
        } catch (UnsupportedEncodingException e) {
           throw new ServiceException(500,"查询地区信息转码出现异常");
        }
        String targetUrl = StrUtil.format(locationUrl, keyWord, TIAN_TK);
        HttpResponse response = HttpRequest.get(targetUrl).execute();
        log.info("执行地区信息查询结果：{}",response);
        if(response.isOk()){
            LngLat lngLat = convert(response);
            return lngLat;
        }
        return null;
    }

    private static LngLat convert(HttpResponse response) {
        JSONObject dataObj =(JSONObject) JSONObject.parse(response.body());
        JSONObject locationObj =(JSONObject) dataObj.get(LngLat.KEY_LOCATION);
        LngLat lngLat = null;
        if(locationObj != null) {
            lngLat = new LngLat();
            lngLat.setSearchVersion(dataObj.getString("searchVersion"));
            lngLat.setStatus(dataObj.getString("status"));
            lngLat.setKeyWord(locationObj.getString("keyWord"));
            lngLat.setLon(locationObj.getString("lon"));
            lngLat.setLat(locationObj.getString("lat"));
            lngLat.setLevel(locationObj.getString("level"));
        }
        return lngLat;
    }

}